﻿using System;
using FTools.Interface;
using System.Collections;
using FTools.Persistencia;
using System.Data.SqlClient;
using FTools.Dominio;
using FTools.Generico;

namespace FTools.Comunicacion
{
    class ComSubProducto : InterfaceSubProducto
    {
        Conexion objConexion = new Conexion();
        SqlConnection conexion;
        SqlTransaction transaccion = null;
        PerSubProducto objPerSubProducto = new PerSubProducto();

        public SubProducto obtenerSubProducto(long xIdSubProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                SubProducto objSubProducto = objPerSubProducto.obtenerSubProducto(conexion, transaccion, xIdSubProducto);
                transaccion.Commit();
                return objSubProducto;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public Boolean existeSubProducto(long xIdSubProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                Boolean existe = objPerSubProducto.existeSubProducto(conexion, transaccion, xIdSubProducto);
                transaccion.Commit();
                return existe;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public Boolean existeSubProducto(String xNombre, long xIdProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                Boolean existe = objPerSubProducto.existeSubProducto(conexion, transaccion, xNombre, xIdProducto);
                transaccion.Commit();
                return existe;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public ArrayList obtenerColeccionSubProducto(long xIdProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                ArrayList colSubProducto = objPerSubProducto.obtenerColeccionSubProducto(conexion, transaccion, xIdProducto);
                transaccion.Commit();
                return colSubProducto;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public ArrayList obtenerBusquedaSubProducto(String xCodigo, String xCodigoInt, String xCodigoProv, String xNombre, String xDescripcion, double xUnidad, long xIdProducto, long xIdFabricante)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                ArrayList colSubProducto = objPerSubProducto.obtenerBusquedaSubProducto(conexion, transaccion, xCodigo, xCodigoInt, xCodigoProv, xNombre, xDescripcion, xUnidad, xIdProducto, xIdFabricante);
                transaccion.Commit();
                return colSubProducto;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public ArrayList obtenerBusquedaSubProductoSimult(String xCodigo, String xCodigoInt, String xCodigoProv, String xNombre, long xIdProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                ArrayList colSubProducto = new ArrayList();
                if (!xCodigo.Equals("") && !xCodigoInt.Equals("") && !xCodigoProv.Equals("") && !xNombre.Equals("") && 
                    xCodigo.Equals(xCodigoInt) && xCodigoInt.Equals(xCodigoProv) && xCodigoProv.Equals(xNombre))
                {
                    colSubProducto = objPerSubProducto.obtenerBusquedaSubProductoSimult(conexion, transaccion, xCodigo, xCodigoInt, xCodigoProv, xNombre, xIdProducto);
                }
                else
                {
                    colSubProducto = objPerSubProducto.obtenerColeccionSubProducto(conexion, transaccion, xIdProducto);
                }
                transaccion.Commit();
                return colSubProducto;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public int altaSubProducto(SubProducto xObjSubProducto)
        {
            PerSpStock objPerSpStock = new PerSpStock();
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                xObjSubProducto.IdSubProducto = FuncionesGenericas.generarNumerador("SUB_PRODUCTO");
                int nro = objPerSubProducto.altaSubProducto(conexion, transaccion, xObjSubProducto);
                //SpStock
                if (!objPerSpStock.existeSpStock(conexion, transaccion, xObjSubProducto.IdSubProducto))
                {
                    SpStock objSpStock = new SpStock();
                    objSpStock.IdSubProducto = xObjSubProducto.IdSubProducto;
                    objSpStock.StockMin = 0;
                    objSpStock.Stock = 0;
                    objPerSpStock.altaSpStock(conexion, transaccion, objSpStock);
                }
                //
                transaccion.Commit();
                return nro;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public int bajaSubProducto(SubProducto xObjSubProducto)
        {
            PerSpStock objPerSpStock = new PerSpStock();
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                int nro = objPerSubProducto.bajaSubProducto(conexion, transaccion, xObjSubProducto);
                //SpStock
                if (objPerSpStock.existeSpStock(conexion, transaccion, xObjSubProducto.IdSubProducto))
                {
                    SpStock objSpStock = objPerSpStock.obtenerSpStock(conexion, transaccion, xObjSubProducto.IdSubProducto);
                    objPerSpStock.bajaSpStock(conexion, transaccion, objSpStock);
                }
                //
                transaccion.Commit();
                return nro;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public int modificaSubProducto(SubProducto xObjSubProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                int nro = objPerSubProducto.modificaSubProducto(conexion, transaccion, xObjSubProducto);
                transaccion.Commit();
                return nro;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }
    }
}
